package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.annotation.CacheFind;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

@Service
public class ItemCatServiceImpl implements ItemCatService {

	@Autowired
	private ItemCatMapper itemCatMapper;

	@Autowired(required = false) //jedis对象在程序启动时不是必须的
	private Jedis jedis;

	@Override
	public String findItemCat(Long itemCatId) {
		ItemCat itemCat = itemCatMapper.selectById(itemCatId);
		return itemCat.getName();
	}

	/**
     * 1.通过parentId查询数据库信息,返回值结果List<ItemCat>
     * 2.将ItemCat信息转化为EasyUITree对象
     * 3.返回的是List<EasyUITree>
     *
     * @param parentId
     * @return
     */
    @CacheFind(key = "ITEM_CAT_PARENTID", seconds = 0)
    @Override
    public List<EasyUITree> findItemCatTree(Long parentId) {
        //1.根据父级分类id查询数据
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        List<ItemCat> catList = itemCatMapper.selectList(queryWrapper);

        //2.需要将数据进行转化.	catList遍历 封装 EasyUITree 添加到集合中即可
        List<EasyUITree> treeList = new ArrayList<>();
        for (ItemCat itemCat : catList) {
			Long id = itemCat.getId();
			String text = itemCat.getName();
			String state = itemCat.getIsParent() ? "closed" : "open"; //是父级就关闭,否则打开
			EasyUITree easyUITree = new EasyUITree(id, text, state);
			treeList.add(easyUITree);
		}
		return treeList;
	}

	/**
	 * 1.先查询redis缓存
	 * true 直接返回数据
	 * false 查询数据库
	 * <p>
	 * key有什么特点
	 * 1.key应该动态变化
	 * 2.key应该标识业务属性
	 * key=ITEM_CAT_PARENTID::parentId
	 *
	 * @param parentId
	 * @return
	 */

	@Override
	public List<EasyUITree> findItemCache(Long parentId) {
		//记录时间
		long start = System.currentTimeMillis();
		//0.定义空集合
		List<EasyUITree> itemCatTree = new ArrayList<>();
		String key = "ITEM_CAT_PARENTID::" + parentId;
		//1.从缓存中查询数据
		String json = jedis.get(key);
		//2.校验json中是否有值
		if (StringUtils.isEmpty(json)) {
			//3.如果缓存中没有数据,则查询数据库
			itemCatTree = findItemCatTree(parentId);
			long end = System.currentTimeMillis();
			//4.为了实现缓存的处理,应该将数据添加到redis中
			//将数据转化为json结构,保存到redis中
			json = ObjectMapperUtil.getJson(itemCatTree);
			jedis.set(key, json);
			System.out.println("第一次查询数据库 耗时" + (end - start));
		} else {
			//标识程序有值 将json数据转化为对象即可
			itemCatTree = ObjectMapperUtil.getObject(json, itemCatTree.getClass());
			long end = System.currentTimeMillis();
			System.out.println("查询redis缓存服务器成功 耗时:" + (end - start));
		}
		return itemCatTree;
	}

//	@Override
//	public List<EasyUITree> findItemCache(Long parentId) {
//
//		//1.获取key,
//		String key = "ITEM_CAT_PARENTID::"+parentId;
//
//		//2.根据key获取value
//		String json = jedis.get(key);
//
//		//若
//		if(StringUtils.isEmpty(json)){
//
//		}
//
//		return null;
//	}
}
